package com.example.exceldemo.liteflowComponent.common;

import com.example.exceldemo.model.DemoContext;
import com.example.exceldemo.model.DocGenerationFile;
import com.example.exceldemo.model.ReqInfoDTO;
import com.example.exceldemo.service.DocTaskService;
import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeComponent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 文档生成结束组件，负责收集和记录生成的文件信息
 * 
 * @author yangwb8
 * @Date 2025/5/17 05:03
 */
@Slf4j
@LiteflowComponent("end")
public class DocumentsEnd extends NodeComponent {
    
    @Autowired
    private DocTaskService docTaskService;
    
    @Override
    public void process() throws Exception {
        log.info("文档生成结束，开始记录生成的文件信息");
        
        DemoContext context = this.getContextBean(DemoContext.class);
        String taskId = context.getTaskId();
        String outputDirPath = context.getOutputDirPath();
        List<ReqInfoDTO> reqInfoList = context.getReqInfoDTOS();
        
        if (taskId == null || taskId.isEmpty()) {
            log.warn("任务ID为空，无法记录文件信息");
            return;
        }
        
        try {
            // 收集生成的文件
            List<DocGenerationFile> generatedFiles = collectGeneratedFiles(outputDirPath, reqInfoList, taskId);
            
            // 记录文件到数据库
            if (!generatedFiles.isEmpty()) {
                log.info("开始记录{}个生成的文件到数据库", generatedFiles.size());
                docTaskService.recordFiles(generatedFiles);
                log.info("文件记录完成");
            } else {
                log.warn("未找到任何生成的文件");
            }
        } catch (Exception e) {
            log.error("记录生成的文件信息时发生错误", e);
            // 不抛出异常，避免整个流程失败
        }
        
        log.info("文档生成流程正常结束");
    }
    
    /**
     * 收集生成的文件信息
     *
     * @param outputDirPath 输出目录路径
     * @param reqInfoList 需求信息列表
     * @param taskId 任务ID
     * @return 文件信息列表
     */
    private List<DocGenerationFile> collectGeneratedFiles(String outputDirPath, List<ReqInfoDTO> reqInfoList, String taskId) {
        List<DocGenerationFile> fileList = new ArrayList<>();
        
        try {
            // 扫描输出目录下的所有文件
            File outputDir = new File(outputDirPath);
            if (!outputDir.exists() || !outputDir.isDirectory()) {
                log.warn("输出目录不存在或不是一个目录: {}", outputDirPath);
                return fileList;
            }
            
            // 对于每个需求目录
            for (ReqInfoDTO reqInfo : reqInfoList) {
                String reqDirName = reqInfo.getReqNo() + reqInfo.getReqName();
                Path reqDirPath = Paths.get(outputDirPath, reqDirName);
                File reqDir = reqDirPath.toFile();
                
                if (!reqDir.exists() || !reqDir.isDirectory()) {
                    log.warn("需求目录不存在: {}", reqDirPath);
                    continue;
                }
                
                // 收集需求目录下的所有文件
                List<File> files = Files.walk(reqDirPath)
                    .filter(Files::isRegularFile)
                    .map(Path::toFile)
                    .collect(Collectors.toList());
                
                for (File file : files) {
                    DocGenerationFile fileInfo = new DocGenerationFile();
                    fileInfo.setTaskId(taskId);
                    fileInfo.setReqNo(reqInfo.getReqNo());
                    fileInfo.setReqName(reqInfo.getReqName());
                    
                    // 保存完整路径用于实际访问文件
                    String fullPath = file.getAbsolutePath();
                    // 但在数据库中只保存文件名，这样前端显示时就只有文件名了
                    String fileName = file.getName();
                    
                    // 在fileInfo中同时保存两个信息
                    fileInfo.setFilePath(fullPath); // 完整路径用于后续访问
                    fileInfo.setFileName(fileName); // 文件名用于显示
                    
                    fileInfo.setFileSize(file.length());
                    
                    // 确定文件类型
                    String fileNameLower = fileName.toLowerCase();
                    if (fileNameLower.endsWith(".docx")) {
                        fileInfo.setFileType("DOCX");
                    } else if (fileNameLower.endsWith(".xlsx")) {
                        fileInfo.setFileType("XLSX");
                    } else if (fileNameLower.endsWith(".pdf")) {
                        fileInfo.setFileType("PDF");
                    } else {
                        fileInfo.setFileType("OTHER");
                    }
                    
                    fileList.add(fileInfo);
                    log.debug("收集到文件: {}, 大小: {} 字节", file.getAbsolutePath(), file.length());
                }
            }
            
            log.info("共收集到{}个文件", fileList.size());
        } catch (Exception e) {
            log.error("收集生成的文件信息时发生错误", e);
        }
        
        return fileList;
    }
}
